///*
// * Copyright (c) 2020 hebeiyiliuba.com
// * All rights reserved.
// *
// */
//package org.jeecg.modules.middleware.redis.message.config;
//
//import org.apache.commons.lang.StringUtils;
//import org.jeecg.modules.middleware.redis.message.constant.enums.RedisChannelEnum;
//import org.jeecg.modules.middleware.redis.message.service.BaseAbstraclListener;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.cache.annotation.EnableCaching;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Scope;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.listener.PatternTopic;
//import org.springframework.data.redis.listener.RedisMessageListenerContainer;
//import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
//import org.springframework.stereotype.Service;
//
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// *redis消息队列配置
// *
// * @author duanlikao
// * @created 2021/8/13
// */
//@Service
//@EnableCaching
//@Configuration
//public class RedisMessageListener {
//
//
//
//      /**
//        * 存放策略实例
//        * classInstanceMap : key-beanName value-对应的策略实现
//        */
//      private ConcurrentHashMap<String, BaseAbstraclListener> classInstanceMap = new ConcurrentHashMap <>(20);
//
//      /**
//       *  注入所有实现了Strategy接口的Bean
//       * @param strategyMap   策略集合
//       */
//     @Autowired
//     public RedisMessageListener(Map <String, BaseAbstraclListener> strategyMap) {
//                 this.classInstanceMap.clear();
//                strategyMap.forEach((k, v) ->
//                                this.classInstanceMap.put(k.toLowerCase(), v)
//                );
//     }
//
//    /**
//     * Redis消息监听器容器-创建连接工厂
//     * @param connectionFactory
//     * @param
//     * @return
//     */
//    @Bean
//    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory){
//        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
//        container.setConnectionFactory(connectionFactory);
//
//
//        RedisChannelEnum[] redisChannelEnums = RedisChannelEnum.values();
//        if (redisChannelEnums.length > 0) {
//             for (RedisChannelEnum redisChannelEnum : redisChannelEnums) {
//                     if (redisChannelEnum == null || StringUtils.isEmpty(redisChannelEnum.getChannel())
//                             || redisChannelEnum.getClassName()==null )  {
//                            continue;
//                       }
//                    //订阅了一个叫pmp和channel 的通道，多通道
//                   //一个订阅者接收一个频道信息，新增订阅者需要新增RedisChannelEnums定义+BaseSub的子类
//                   String toLowerCase = redisChannelEnum.getClassName().getSimpleName().toLowerCase();
//                   BaseAbstraclListener baseSub = classInstanceMap.get(toLowerCase);
//                   container.addMessageListener(listenerAdapter(baseSub), new PatternTopic(redisChannelEnum.getChannel()));
//               }
//        }
//         return container;
//
//    }
//
//    @Bean()
//    @Scope("prototype")
//    public MessageListenerAdapter listenerAdapter(@Qualifier("BaseAbstraclListener") BaseAbstraclListener baseSub){
//         //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器，利用反射的方法调用“receiveMessage”
//        //也有好几个重载方法，这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
//       //注意2个通道调用的方法都要为receiveMessage
//        return new MessageListenerAdapter(baseSub, "receiveMessage");
//    }
//    /**
//     * 创建连接工厂
//     * @param connectionFactory
//     * @param listenerAdapter
//     * @return
//     */
////    @Bean
////    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
////            MessageListenerAdapter listenerAdapter,MessageListenerAdapter listenerAdapterTest2){
////        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
////        container.setConnectionFactory(connectionFactory);
////        //接受消息的key
////        container.addMessageListener(listenerAdapter,new PatternTopic(RedisChannelEnum.SHIPPING_DISCHARGE.getChannel()));
////        container.addMessageListener(listenerAdapterTest2,new PatternTopic(RedisChannelEnum.SHIPPING_DISCHARGE.getChannel()));
////        return container;
////    }
//
//
//    /**
//     * 运单接单装货-绑定消息监听者和接收监听的方法
//     * @param receiver
//     * @return
//     */
////    @Bean
////    public MessageListenerAdapter listenerAdapter(ShippingEntruckingConsumerListener receiver){
////        return new MessageListenerAdapter(receiver,"receiveMessageShippingEntrucking");
////    }
//    /**
//     * 运单接货签收-绑定消息监听者和接收监听的方法
//     * @param receiver
//     * @return
//     */
////    @Bean
////    public MessageListenerAdapter listenerAdapterTest2(ShippingEntruckingConsumerListener receiver){
////        return new MessageListenerAdapter(receiver,"receiveMessageShippingDischarge");
////    }
//    /**
//     * 注册订阅者
//     * @param latch
//     * @return
//     */
////    @Bean ShippingEntruckingConsumerListener receiver(CountDownLatch latch) {
////        return new ShippingEntruckingConsumerListener(latch);
////    }
//
//
//    /**
//     * 计数器，用来控制线程
//     * @return
//     */
////    @Bean
////    public CountDownLatch latch(){
////        return new CountDownLatch(1);//指定了计数的次数 1
////    }
//
//}
